package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.entity.*;
import com.itheima.mapper.EmpExprMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.service.EmpLogService;
import com.itheima.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;
    @Autowired
    private EmpLogService empLogService;

    @Override
    public PageBean page(EmpQueryParam param) {

        //1.设置分页参数
        PageHelper.startPage(param.getPage(), param.getPageSize());


        //2.调用mapper列表查询方法

        List<Emp> empList = empMapper.list(param);
        Page p = (Page) empList;
        //3.封装PageBean对象并返回

        return new PageBean(p.getTotal(), p.getResult());
    }

    @Transactional(rollbackFor = Exception.class)//事务回滚
    @Override
    public void add(Emp emp) {
        try {
            //调用 mapper 方法，保存员工的基本信息到 emp 表
            //1.首先补齐不能从前端接受的数据 password create_time update_time
            emp.setPassword("123456");
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            empMapper.add(emp);

            Integer id = emp.getId();
            List<EmpExpr> exprList = emp.getExprList();
            //关联员工 ID（一个员工可能会有多个经历，所以要用循环插入，并且插入前要判空）
            if (!CollectionUtils.isEmpty(exprList)) {
                exprList.forEach(expr -> expr.setEmpId(id));
                //调用 mapper 方法，保存员工的工作经历到 emp——expr 表
                empExprMapper.add(exprList);

            }
        } finally {
            //无论新增员工是否成功，都需要添加日志
            EmpLog empLog = new EmpLog();
            empLog.setOperateTime(LocalDateTime.now());
            empLog.setInfo("插入员工信息" + emp);
            empLogService.insertLog(empLog);
        }


    }

    @Override
    public void delete(List<Integer> ids) {
        empMapper.delete(ids);
        empExprMapper.delete(ids);
    }

    @Override
    public Emp getById(Integer id) {

        //查询员工基本信息，封装到 emp 对象中
        Emp emp = empMapper.getById(id);


        //查询员工工作经历，封装到 emp 对象中

        List<EmpExpr> exprList = empExprMapper.getByEmpId(id);
        emp.setExprList(exprList);

        return emp;


    }

    //    @Transactional(rollbackFor = Exception.class)
    @Override
    public void update(Emp emp) {
        //1.更新员工基本信息
        //1.1补充基础属相--更新时间
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.update(emp);


        //2.修改员工的工作经历信息--emp_expr 表
        //先删后增

        empExprMapper.deleteByID(emp.getId());
        List<EmpExpr> exprList = emp.getExprList();
        if (!CollectionUtils.isEmpty(exprList)) {
            exprList.forEach(expr -> expr.setEmpId(emp.getId()));

        }
        empExprMapper.add(emp.getExprList());

    }

    @Override
    public List<Emp> getList(Emp emp) {
        List<Emp> empList = empMapper.getList(emp);

        return empList;
    }
}